/* SPDX-License-Identifier: (GPL-2.0 OR BSD-3-Clause)
 *
 * Copyright (C) 2017-2018 Jason A. Donenfeld <Jason@zx2c4.com>. All Rights Reserved.
 */

#include <seminix/linkage.h>

#include <asm/assembler.h>

ENTRY(__ashlti3)
    cbz	x2, 1f
    mov	x3, #64
    sub	x3, x3, x2
    cmp	x3, #0
    b.le	2f
    lsl	x1, x1, x2
    lsr	x3, x0, x3
    lsl	x2, x0, x2
    orr	x1, x1, x3
    mov	x0, x2
1:
    ret
2:
    neg	w1, w3
    mov	x2, #0
    lsl	x1, x0, x1
    mov	x0, x2
    ret
ENDPROC(__ashlti3)

ENTRY(__ashrti3)
    cbz	x2, 1f
    mov	x3, #64
    sub	x3, x3, x2
    cmp	x3, #0
    b.le	2f
    lsr	x0, x0, x2
    lsl	x3, x1, x3
    asr	x2, x1, x2
    orr	x0, x0, x3
    mov	x1, x2
1:
    ret
2:
    neg	w0, w3
    asr	x2, x1, #63
    asr	x0, x1, x0
    mov	x1, x2
    ret
ENDPROC(__ashrti3)

ENTRY(__lshrti3)
    cbz	x2, 1f
    mov	x3, #64
    sub	x3, x3, x2
    cmp	x3, #0
    b.le	2f
    lsr	x0, x0, x2
    lsl	x3, x1, x3
    lsr	x2, x1, x2
    orr	x0, x0, x3
    mov	x1, x2
1:
    ret
2:
    neg	w0, w3
    mov	x2, #0
    lsr	x0, x1, x0
    mov	x1, x2
    ret
ENDPROC(__lshrti3)
